Published on January 17, 2025

返回

转到题目

题目思路:

我们要根据这个没有规律的”01”来构造出来答案 我们定然要找到这个”一步步”具有”封闭、连贯性”的构造方法,这就是”构”造

  1. 如果某个位置bool_value[n]为1,那么前n位就可以成一个排列.
    • 我们至少要保证,前n位一定是没有重复数字
      • 这里还能得到一个推论:前n个数都要出现
      • 这是我们面对一个状态”1/0”的解,而我们要考虑一个状态”01”串:
        • 这样我们就要保证让每一位的构造,都要为后一位的构造留足空间(空间为:0)
        • 否则构造就会中断,运行不起来
  2. 如果是0的话,那就是不能构成排列:
    • 但是根据我们前面的推导,就算是不能成排列,这一位的构造也要为后一位留足空间(空间为:1)
  3. 最后一位:
    • 最后一位是不用且不能留空间的,因为后面不再有后续构造了
    • 但最后一位如果是0的话,之前留的空间就会有剩余,就一定不能构造出来,也就是无解.
  4. 到这一步,我们就要考虑怎么构造每一位:

    • 保证按要求为后一位留足空间
    • 保证前n位存在且唯一:
      • 由一位决定性质:
        • 那我就可以利用”偏移留空间”与”补足”来实现这个机制

代码实现:

l = int(input())
sub = list(map(int,[i for i in input()]))
res= []
if(sub[-1] ==0):
    print(-1)
else:
    prev =-1
    cnt =0
    for idx,e in enumerate(sub):

        if(e==1):
            res.append(prev+2)
            prev = idx
        else:
            res.append(idx+2)

    res = list(map(str,res))    
    print(" ".join(res))